<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script>
      /* 
            
            递归
                - 调用自身的函数称为递归函数
                - 递归的作用和循环是基本一致的  

            递归的核心思想就是将一个大的问题,拆分成一个个小的问题,小的问题解决了,大的问题也就解决了

            编写递归函数,一定要包括两个要件:
                1. 基线条件 -- 递归的终止条件
                2. 递归条件 -- 如何对问题进行拆分
            递归的作用和循环是一只的,不同在于,递归的思路更加清晰整洁,循环执行性能比较好
                再开发中,一般的问题可以通过循环解决,也是尽量去使用循环,少用递归
                只在一些使用循环解决比较麻烦的场景下,才使用递归
        */

      /* 
            阶乘
                1! 1
                2! 1 X 2 = 2
                3! 1 X 2 X 3 = 6
                ...
        */
      function jiecheng(num) {
        let result = 1;
        for (i = 2; i <= num; i++) {
          result *= i;
        }
        return result;
      }
      let result = jiecheng(3)
      console.log(result);

      function jiecheng2(num){
            // 基线条件
            if(num === 1){
                return 1
            }
            // 递归条件是什么
            // num! = (num-1) * num
            return jiecheng2(num-1) *num
      }
      result = jiecheng2(4)
    //   return jiecheng2(3) * 4 = 24
    //   return jiecheng2(2) * 3 =6
    //   return jiecheng2(1) * 2 =2
    //   return 1
    console.log(result);
    </script>
  </head>
  <body></body>
</html>
